package com.rzcode.coinex.kernel.dao.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.rzcode.coinex.kernel.common.enums.AdTypeEnum;
import com.rzcode.coinex.kernel.common.enums.OrderStateEnum;
import com.rzcode.coinex.kernel.domain.Alipay;
import com.rzcode.coinex.kernel.domain.BankInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * 场外交易订单实体类，用于存储场外交易的所有相关信息。
 *
 * @author Bridge.Xu
 * @date 2020年12月11日
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "otc_order")
public class Order {

    /**
     * 订单编号，数据库主键。
     */
    @ApiModelProperty(value = "订单编号")
    private Long id;

    /**
     * 订单号，用于用户识别的唯一标识。
     */
    @ApiModelProperty(value = "订单号")
    private String orderSn;

    /**
     * 广告类型，标识交易方向，买入或卖出。
     */
    @ApiModelProperty(value = "广告类型，0表示买入，1表示卖出")
    private AdTypeEnum advertiseType;

    /**
     * 创建时间，订单创建的时间戳。
     */
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;

    /**
     * 广告拥有者ID，发起交易的用户ID。
     */
    @ApiModelProperty(value = "广告拥有者ID")
    private Long memberId;

    /**
     * 广告拥有者姓名，发起交易的用户名称。
     */
    @ApiModelProperty(value = "广告拥有者姓名")
    private String memberName;

    /**
     * 广告拥有者真实姓名，用于实名认证。
     */
    @ApiModelProperty(value = "广告拥有者真实姓名")
    private String memberRealName;

    /**
     * 交易对象ID，与广告拥有者进行交易的另一方用户ID。
     */
    @ApiModelProperty(value = "交易对象ID")
    private Long customerId;

    /**
     * 交易对象用户名，与广告拥有者进行交易的另一方用户名。
     */
    @ApiModelProperty(value = "交易对象用户名")
    private String customerName;

    /**
     * 交易对象真实姓名，用于实名认证。
     */
    @ApiModelProperty(value = "交易对象真实姓名")
    private String customerRealName;

    /**
     * 币种，交易涉及的数字货币类型。
     */
    @ApiModelProperty(value = "币种")
    private OtcCoin coin;

    /**
     * 价格，交易单价。
     */
    @ApiModelProperty(value = "价格")
    private BigDecimal price;

    /**
     * 最高单笔交易额，广告设定的最高交易限额。
     */
    @ApiModelProperty(value = "最高单笔交易额")
    private BigDecimal maxLimit;

    /**
     * 国家，交易者的国家信息。
     */
    @ApiModelProperty(value = "国家")
    private String country;

    /**
     * 最低单笔交易额，广告设定的最低交易限额。
     */
    @ApiModelProperty(value = "最低单笔交易额")
    private BigDecimal minLimit;

    /**
     * 顾客需求，交易者可能提出的具体要求或备注。
     */
    @ApiModelProperty(value = "顾客需求")
    private String remark;

    /**
     * 付款期限，买家完成支付的时限，单位为分钟。
     */
    @ApiModelProperty(value = "付款期限，单位分钟")
    private Integer timeLimit;

    /**
     * 交易金额，实际交易的总金额。
     */
    @ApiModelProperty(value = "交易金额")
    private BigDecimal money;

    /**
     * 交易数量，交易的币种数量。
     */
    @ApiModelProperty(value = "交易数量")
    private BigDecimal number;

    /**
     * 手续费，交易过程中产生的费用。
     */
    @ApiModelProperty(value = "手续费")
    private BigDecimal commission;

    /**
     * 状态，订单当前的状态。
     */
    @ApiModelProperty(value = "状态")
    private OrderStateEnum status;

    /**
     * 付款时间，买家完成支付的时间。
     */
    @ApiModelProperty(value = "付款时间")
    private Date payTime;

    /**
     * 付费方式，买家使用的支付方式列表。
     */
    @ApiModelProperty(value = "付费方式列表，用英文逗号隔开")
    private String payMode;

    /**
     * 广告ID，与订单相关的广告标识。
     */
    @ApiModelProperty(value = "广告ID")
    private Long advertiseId;

    /**
     * 订单取消时间，如果订单被取消，则记录取消时间。
     */
    @ApiModelProperty(value = "订单取消时间")
    private Date cancelTime;

    /**
     * 放行时间，订单完成放行的时间。
     */
    @ApiModelProperty(value = "放行时间")
    private LocalDateTime releaseTime;

    /**
     * 支付宝信息，如果使用支付宝支付则包含此信息。
     */
    @ApiModelProperty(value = "支付宝信息")
    private Alipay alipay;

    /**
     * 银行信息，如果使用银行转账则包含此信息。
     */
    @ApiModelProperty(value = "银行信息")
    private BankInfo bankInfo;

    /**
     * 微信支付信息，如果使用微信支付则包含此信息。
     */
    @ApiModelProperty(value = "微信支付信息")
    private WechatPay wechatPay;

    /**
     * 版本号，用于乐观锁。
     */
    @ApiModelProperty(value = "版本号，用于乐观锁")
    private Long version;
}
